package cn.lcsjsxy.yxc.objectoriented.instanceof的使用;

/**
 *
 */
public class PersonTest {

    public static void main(String[] args) {
        Person P1 = new Person();
        P1.eat();
        Man man = new Man();
        man.eat();
        man.age = 25;
        man.earnMoney();

        //*******************************************************
        //子类对象的多态性：父类的引用指向子类的对象
        Person P2 = new Man();
        //com.yang_xc.miscellaneous.Person p3=new Woman();
        //多态的使用：当调用子父类同名同参数的方法时，史记执行的是子类重写父类的方法——————虚拟的方法调用
        P2.eat();  //此处调用的是子类中重写的方法
        P2.walk();  //同上
        System.out.println(P2.id);  //此处打印的是父类中的值
        //不能调用子类所特有的方法/属性，编译时，P2是Person类型
        //P2.earnMoney();
        //P2.isSmoking=true;
        P2.name = "Tom";
        //有了对象的多态性以后，内存中实际上是加载了子类特有的属性和方法的，但是由于变量声明为父类类型，导致
        //编译时，只能调用父类中声明的属性和方法，子类中特有的属性和方法不能调用

        //如何才能调用子类特有的属性和方法？
        //使用强制类型转换符
        Man m1 = (Man) P2;
        m1.isSmoking = true;

        //使用强转时，可能出现ClassCastException的异常
        //Woman w1=(Woman)P2;
        //w1.goShopping();

        /*
        instanceof关键字的使用

        com.yang_xc.a instanceof A:判断对象a是否是类A的实例。如果是，返回true，如果不是，返回false。

        使用情景：为了避免在向下转型时出现ClassCastException的异常，我们在向下转型之前，先进行
        instanceof的判断，一旦返回true，就进行向下转型，如果返回false，不进行向下转型。

        如果 com.yang_xc.a instanceof A返回true，则a instanceof B也返回true
        其中，A是B的子类（B是A的父类）
         */
        if (P2 instanceof Woman) {
            Woman w1 = (Woman) P2;
            w1.goShopping();
            System.out.println("Woman");
        }

        if (P2 instanceof Man) {
            Man m2 = (Man) P2;
            m2.earnMoney();
            System.out.println("Man");
        }
        //练习：
        //问题一：编译时通过，运行时不通过
//    com.yang_xc.miscellaneous.Person P3=new Woman();
//    Man m2=(Man)P3;
        //问题二：编译时通过，运行时也通过
        Object object=new Woman();
        Person p=(Person) object;
        //问题三：编译不通过
//        Man m3=new Woman()
    }
}
